package com.warm.jpa.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "base_user")
@GenericGenerator(name = "id_uuid", strategy = "uuid")
@DynamicUpdate
@Data
public class BaseUserEntity {

    /**
     * SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题 --> org.hibernate.cfg.PropertyContainer -->
     *       TreeMap<String, XProperty>  -->  LinkedHashMap<String, XProperty>
     */

    @Id
    /**
        JPA提供的四种标准用法为 TABLE, SEQUENCE, IDENTITY, AUTO.
        TABLE：使用一个特定的数据库表格来保存主键。
        SEQUENCE：根据底层数据库的序列来生成主键，条件是数据库支持序列。
        IDENTITY：主键由数据库自动生成（主要是自动增长型）
        AUTO：主键由程序控制。
    */
    @GeneratedValue(generator = "id_uuid", strategy = GenerationType.IDENTITY)
    @Column(name = "id", length = 32)
    private String id;

    /**
     *  @Transient //此字段不与数据库关联
     *  @Version   //此字段加上乐观锁
     */
    @Column(name = "account", nullable = false, unique = true, columnDefinition="varchar(32) COMMENT '用户账户'")
    private String account;

    @Column(name = "password", nullable = false, columnDefinition="varchar(32) COMMENT '用户密码'")
    private String password;

    @Column(name = "name", length = 32)
    private String name;

    @Column(name = "sex", columnDefinition="int default 0")
    private Integer sex;

    @Column(name = "age")
    private Integer age;


    /* @CreationTimestamp */
    /**
     *   DATE: 表示只存日期 如：2019-07-31
     *   TIME: 表示只存时间 如：19:52:25
     *   TIMESTAMP: 表示是一个带有时间的日期  如：2019-07-31 19:52:25
     *   只能用于 Data / Calendar
     */
    //@Temporal(TemporalType.TIMESTAMP) // 出参时间格式化为 yyyy-MM-dd 类型日期
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 入参时，请求报文只需要传入yyyymmddhhmmss字符串进来，则自动转换为Date类型数据
    @Column(name = "create_time", updatable = false, nullable = false, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    private LocalDateTime createTime;

    /*@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Temporal(TemporalType.TIMESTAMP)
    @UpdateTimestamp*/

    @Column(name = "update_time", nullable = false, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    private LocalDateTime updateTime;
}
